libxl: prevent creation of domains with duplicate names
authorIan Jackson <Ian.Jackson@eu.citrix.com>
Fri, 28 Jan 2011 18:39:09 +0000 (18:39 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Fri, 28 Jan 2011 18:39:09 +0000 (18:39 +0000)
libxl_domain_rename is where domain names are assigned.  Therefore
this is where we check that no two domains have the same name.  As a
special exception, domains whose names are "" are not considered to
clash.

We also take special care not to mind if we try to rename a domain to
the name it already has.

Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl.c
tools/libxl/libxl_create.c

index 9658d6714e0c56f3d5d9c4a0f3df5c2dbedf70b7..2d2b884baf34765da5d37ab8869d2a2cdd1f3464 100644 (file)
@@ -141,6 +141,28 @@ int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
         }
     }
 
+    if (new_name[0]) {
+        /* nonempty names must be unique */
+        uint32_t domid_e;
+        rc = libxl_name_to_domid(ctx, new_name, &domid_e);
+        if (rc == ERROR_INVAL) {
+            /* no such domain, good */
+        } else if (rc != 0) {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unexpected error"
+                       "checking for existing domain");
+            goto x_rc;
+        } else if (domid_e == domid) {
+            /* domain already has this name, ok (but we do still
+             * need the rest of the code as we may need to check
+             * old_name, for example). */
+        } else {
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "domain with name \"%s\""
+                       " already exists.", new_name);
+            rc = ERROR_INVAL;
+            goto x_rc;
+        }
+    }
+
     if (old_name) {
         got_old_name = xs_read(ctx->xsh, trans, name_path, &got_old_len);
         if (!got_old_name) {
index 1879de048de186819933d78d1591b4de9609964a..dc2621468ede4f82871a2741cec904638ee471b7 100644 (file)
@@ -351,6 +351,7 @@ int libxl__domain_make(libxl_ctx *ctx, libxl_domain_create_info *info,
 
 retry_transaction:
     t = xs_transaction_start(ctx->xsh);
+
     xs_rm(ctx->xsh, t, dom_path);
     xs_mkdir(ctx->xsh, t, dom_path);
     xs_set_permissions(ctx->xsh, t, dom_path, roperm, ARRAY_SIZE(roperm));